/**
 * Classe Gerenciador. Responsável por gerenciar o processo de consolidação dos
 * epitopos
 */
package epibot.testeProteinas;

import epibot.BancoDeDados.Tabelas;
import epibot.EstruturasBiologicas.Epitopo;
import epibot.EstruturasBiologicas.Proteina;
import java.util.ArrayList;
import java.util.Iterator;

/**
 *
 * @author Rafael Tosta
 */
public class Consolidacao {

    private ArrayList<Epitopo> listaGeral;
    private ProcessadorDeArquivos pda;
    private Ordenacao ord;
    private TabelaHash th;
    private String tamanho;
    private String alelo;
    private String nomeDaCalibragem;
    private ArrayList<ArrayList<Proteina>> consulta;
    private GerenciadorRobot_Teste gt;

    /**
     * Construtor
     *
     * @param urlSaida Diretório de saída dos arquivos
     * @param conexao Conexão com o banco de dados
     * @param f Referencia do Frame principal
     * @param nomeDaCalibragem Nome da calibragem
     * @param tamanho Tamanho do epitopo
     * @param alelo Alelo
     * @param p Referencia do painel do consolidador
     */
    public Consolidacao(GerenciadorRobot_Teste gt, String nomeDaCalibragem, String tamanho,
            String alelo, ArrayList<ArrayList<Proteina>> consulta) {
        this.listaGeral = new ArrayList<Epitopo>();
        this.ord = new Ordenacao();
        this.th = new TabelaHash();
        this.pda = new ProcessadorDeArquivos();
        this.tamanho = tamanho;
        this.alelo = alelo;
        this.nomeDaCalibragem = nomeDaCalibragem;
        this.consulta = consulta;
        this.gt = gt;
    }

    /**
     * Inicia o processo de leitura de todos os arquivos dentro do diretorio
     * informado, iniciando tambem a escrita dos resultados em arquivo
     */
    public void iniciaConsolidacao() {
        ArrayList<String> s = Tabelas.getTabelaNotaDoSite().getTodosIdSite(this.nomeDaCalibragem);
        // a consolidação é feita pelas proteinas e epitopos de cada site, sendo um de cada vez

        gt.iniciaPBar(consulta.size());
        for (int i = 0; i < consulta.size(); i++) {
            ArrayList<Proteina> get = consulta.get(i);

            if (!get.isEmpty()) {

                //System.out.println(get.get(0).getSite());
                String nomeSite = get.get(0).getSite();
                String idSite = Tabelas.getTabelaSites().getIdSite(nomeSite);

                //pega um conjunto de proteinas de um determinado site no banco de dados
                ArrayList<Proteina> listaDeProteinas = pda.leitura(get, this.nomeDaCalibragem, idSite, this.tamanho,
                        this.alelo);
                if (listaDeProteinas.isEmpty()) {
                    //  JOptionPane.showMessageDialog(p, "Error, No protein found site " + nomeSite);
//                    return;
                } else {

                    //converte uma lista de proteina em uma de epitopo
                    ArrayList<Epitopo> temp = ord.converteTipoListaEpitopo(listaDeProteinas);

                    //ordena os epitopos
                    ArrayList<Epitopo> quickSort = ord.quick(temp, 0, temp.size() - 1);
                    //escreve os epitopos ordenados em arquivo
                    // pda.escritaResultados1(quickSort, nomeSite);

                    //adcionando os epitopo na tabela hash para obter os epitopos gerais
                    Epitopo epitopo = null;
                    for (Iterator iterator = quickSort.iterator(); iterator.hasNext();) {
                        epitopo = (Epitopo) iterator.next();
                        th.adicionaEpitopos(epitopo);
                        gt.print(epitopo.getProteina() + " --> " + epitopo);
                    }

                }//fim else
            }//fim if
            gt.setValuePBar(i + 1);
        }//fim do for

        /*
         * Realiza a operacao referente ao arquivo geral contendo a normalizacao
         * dos epitopos em relacao a todos os sites de pesquisa
         */
        ArrayList<EpitopoGeral> tabelaEmLista = th.getListaDeEpitopos();
        ArrayList<EpitopoGeral> temp = ord.quickGeral(tabelaEmLista, 0, tabelaEmLista.size() - 1);

        this.setRankDosEpitoposGerais(temp);

        gt.telainicial();
        //pda.escritaResultadoGlobal(temp);
        JFrameResultadosTeste nf = new JFrameResultadosTeste(temp);
        nf.setVisible(true);
        nf.show();
    }

    /**
     * Atualiza os rank de todos os epitipos gerais e retorna a lista com todos
     * os epitopos atualizados
     *
     * @param ep Lista de epitopos gerais
     *
     * @return Lista de epitopos gerais atualizados
     */
    private ArrayList<EpitopoGeral> setRankDosEpitoposGerais(ArrayList<EpitopoGeral> ep) {
        EpitopoGeral e1, e2;
        int rank = 0;
        double scoreEpAnt = 9999999;

        for (Iterator iterator = ep.iterator(); iterator.hasNext();) {
            e1 = (EpitopoGeral) iterator.next();

            if (e1.getScoreGlobal() == scoreEpAnt) {
                e1.setRank(rank);
            } else {
                rank++;
                e1.setRank(rank);
            }
            scoreEpAnt = e1.getScoreGlobal();
        }
        return ep;
    }
}
